package com.langfeiyes.pattern.template.demo1;


/**
 * 模板父类
 */
public abstract  class AbstractTemplate {
    /**
     * 固定算法骨架
     * 固定，不能变动，子类无法重写
     */
    public final void  templateMethod(){
        //步骤1
        this.operation1();
        //步骤2
        this.operation2();
        //步骤3
        this.operation3();
        //步骤4
        this.operation4();
    }

    private void operation1() {
        System.out.println("步骤1：一种情况：逻辑固定，子类无法继承与重写，使用private修饰");
    }

    protected final void operation2() {
        System.out.println("步骤2：一种情况：逻辑固定，允许子类继承，但不允许重写，使用protected + final修饰");
    }

    protected  void commOperation() {
        System.out.println("普通方法，不是具体的算法步骤，允许子类继承与重写，使用protected修饰");
    }


    //步骤3：一种情况：父类无法确定如何实现，由子类继承并重写，使用protected修饰
    protected abstract void operation3();

    protected  void operation4(){
        System.out.println("步骤4：钩子方法，父类提供默认实现，子类可选择性实现，使用protected修饰");
    }

}
